class A {
    public A(){
        System.out.println("A的构造方法");
    }

    {
        System.out.println("A的构造代码块");
    }

    static {
        System.out.println("A的静态代码块");
    }
}

class B extends A {
    public B(){
        System.out.println("B的构造方法");
    }

    {
        System.out.println("B的构造代码块");
    }

    static {
        System.out.println("B的静态代码块");
    }
}
public class demo extends B{
    public static void main(String[] args) {
        new demo();
        new demo();

//        执行结果 和顺序是什么样的?
//A的静态代码块
//B的静态代码块
//A的构造代码块
//A的构造方法
//B的构造代码块
//B的构造方法
//A的构造代码块
//A的构造方法
//B的构造代码块
//B的构造方法

// 先加载静态代码块
//加载demo类的时候发生的 此时还没有执行main呢
//
//咱们的程序是从main开始执行
//main这里是demo的方法
//
//因此要执行main 就需要先加载demo
//demo继承自B
//要加载demo 就要先加载B
//B继承自A
//要加载B 就要先加载A
//只要这个类被用到了 就要先加载这个类
//(实例化 调用方法 调用静态方法 被继承.....都算被用到)
//要想构造demo 就得先构造B
//要想构造B 就得先构造A
//对于A来说 构造过程=构造代码块的执行+构造方法的执行
    }

//  大原则
//1.类加载阶段会进行静态代码块的执行.要想创建实例，势必要先进行类加载.
//2.静态代码块只是类加载阶段执行一次
//3.构造方法和构造代码块，每次实例化都会执行，构造代码块在构造方法前面
//4.父类执行在前，子类执行在后
//5.咱们的程序是从main开始执行  main这里是demo的方法   因此要执行main就需要先加载demo

}
